package com.unitd.modules.gen.controller;

import com.github.pagehelper.PageInfo;
import com.unitd.comm.web.BaseController;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.springweb.controller.result.AjaxResult;
import com.unitd.frame.sso.annotation.Permission;
import com.unitd.modules.gen.entity.GenScheme;
import com.unitd.modules.gen.service.IGenSchemeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @desc 生成方案Controller
 * @filename GenSchemeController.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017/4/27
 */
@Controller
@RequestMapping("/gen/genScheme")
public class GenSchemeController extends BaseController {

	@Autowired
	private IGenSchemeService genSchemeService;

	/**
	 * @desc 转到信息列表页
	 * @return 列表页地址
	 */
	@Permission("gen:genScheme:list")
	@RequestMapping("/list")
	public String list() {
		return "/modules/gen/scheme/list";
	}

	/**
	 * @desc 获取信息列表json数据,方便列表页通过ajax获取并展示
	 * @param param 前端请求参数信息
	 * @return json数据
	 */
	@Permission("gen:genScheme:list")
	@RequestMapping("/listJson")
	@ResponseBody
	public String listJson(GenScheme genScheme, @RequestParam Map<String, Object> param) {
		// 获取分页数据信息
		Map<String, Integer> pageMap = getPageMap();

		// 查询列表数据
		PageInfo<GenScheme> pageData = genSchemeService.getPageData(pageMap.get("pageNo"), pageMap.get("pageSize"), genScheme);
		return jsonPage(pageData);
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @param model springMVC的前端数据模型对象
	 * @param schemeId 生成方案主键ID
	 * @return 详情页地址及数据
	 */
	@Permission("gen:genScheme:view")
	@RequestMapping("/toView/{id}")
	public String toView(Model model, @PathVariable("id") String schemeId) {
		// 获取数据对象
		getDataById(model, schemeId);

		// 转到对应前端页面
		model.addAttribute("action", "doView");
		return "/modules/gen/scheme/edit";
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @param model springMVC的前端数据模型对象
	 * @param schemeId 生成方案主键ID
	 * @return 详情页地址及数据
	 */
	@Permission("gen:genScheme:edit")
	@RequestMapping("/toEdit/{id}")
	public String toEdit(Model model, @PathVariable("id") String schemeId) {
		// 获取数据对象
		getDataById(model, schemeId);

		// 转到对应前端页面
		return "/modules/gen/scheme/edit";
	}

	@Permission("gen:genScheme:edit")
	@RequestMapping(value = "/doEdit", method = RequestMethod.POST)
	@ResponseBody
	public AjaxResult doEdit(Model model, GenScheme genScheme, @RequestParam Map<String, Object> param) {
		String validatMsg = beanValidator(model, genScheme);
		if(!StringUtils.isNull(validatMsg)) {
			return new AjaxResult(false, "处理数据失败![" +validatMsg+"]");
		}

		// 保存数据,并根据情况生成对应的文件
		String result = genSchemeService.doEdit(genScheme, getSSOToken().getUid());

		// 返回前台结果
		if(!StringUtils.isNull(result)) {
			return new AjaxResult(true);
		} else {
			return new AjaxResult(false, "处理数据失败![没有需要处理的生成方案信息]");
		}
	}

	/**
	 * @desc 逻辑删除前端制定的数据
	 * @param genScheme 生成方案表对象
	 * @return AjaxResult
	 */
	@Permission("gen:genScheme:delete")
	@RequestMapping(value = "doDelete")
	@ResponseBody
	public AjaxResult delete(GenScheme genScheme) {
		// 逻辑删除
		genSchemeService.deleteByDelFlag(genScheme);

		return new AjaxResult(true);
	}

	/**
	 * @desc 根据生成方案ID获取对应的方案详情,方便前端使用
	 * @param model springMVC的前端数据模型对象
	 * @param schemeId 生成方案主键ID
	 */
	private void getDataById(Model model, String schemeId) {

		// 根据ID获取表生成方案详情
		Map<String, Object> dataMap = genSchemeService.toEdit(schemeId);

		model.addAttribute("genScheme", dataMap.get("genScheme"));
		model.addAttribute("genTableComments", dataMap.get("genTableComments"));
		model.addAttribute("config", dataMap.get("config"));
		model.addAttribute("tableList", dataMap.get("tableList"));
	}
}